先附上两张珍藏的原理图


直接上代码
import network
import time
from machine import Pin, Timer, PWM
import socket
# 无线网连接信息
SSID = "mxblog.mxguanwang.cn"
PASSWORD = "mx88888888"
#
D1 = Pin(5, Pin.OUT, value=1)
D2 = Pin(4, Pin.OUT, value=1)
D3 = Pin(0, Pin.OUT, value=1)
D5 = Pin(14, Pin.OUT, value=1)
D6 = Pin(12, Pin.OUT, value=1)
D7 = Pin(13, Pin.OUT, value=1)
# 板子自带LED灯
LED = Pin(2, Pin.OUT, value=1)
#控制方向的
IN1 = D1
IN2 = D2
IN3 = D3
IN4 = D5
# 控制左右转速的
sp_pwm_L = PWM(D6, 1000)
sp_pwm_R = PWM(D7, 1000)
# 状态信息
speed_L = 0 # 速度(-1023-1023) 负的情况下是反转
speed_R = 0 # 速度(-1023-1023)
speed_L_Cur = 0 # 当前速度
speed_R_Cur = 0 # 当前速度
# 为了解决浅拷贝问题的中间变量
speed_L_1 = 0
speed_R_1 = 0
# 连接无线网
def connectWifi(ssid, passwd):
print("开始连接无线网")
wlan = network.WLAN(network.STA_IF) # create a wlan object
# wlan.active(False)
wlan.active(True) # Activate the network interface
wlan.disconnect() # Disconnect the last connected WiFi
wlan.connect(ssid, passwd) # connect wifi
while (wlan.ifconfig()[0] == '0.0.0.0'):
time.sleep(1)
print("无线网连接完成")
LED.value(0)
# 顺序:连接wifi -> 连接服务器
wlan = connectWifi(SSID, PASSWORD)
# 默认前进
IN1.value(1)
IN2.value(0)
IN3.value(1)
IN4.value(0)
LED.value(1)
while True:
sock = socket.socket()
# 尝试连接服务器
try:
sock.connect(('你的IP', 你的端口))
print("服务器连接成功")
LED.value(0)
except OSError as err:
LED.value(1)
sock.close()
print("连接失败,重连中。" + str(err))
time.sleep(2)
continue
while True:
try:
sock.send("g")
recvdata = sock.recv(8)
if recvdata == None:
sock.close()
print("连接已断开1")
LED.value(1)
time.sleep(2)
break
recvdata = recvdata.decode('utf-8')
if len(recvdata) == 0:
sock.close()
print("连接已断开2")
LED.value(1)
time.sleep(2)
break
if len(recvdata) != 8:
sock.close()
print("连接已断开4")
LED.value(1)
time.sleep(2)
break
speed_L_1 = int(recvdata[0:4])
if speed_L_1 >= 5000:
speed_L_1 = 5000 - speed_L_1
speed_R_1 = speed_L_1
# 计算左右差值
x = int(recvdata[4:8])
if x >= 5000:
x = 5000 - x
# 0 - 1023 右转
# -1023 - 0 左转
# 存在差值则进行计算
if x != 0:
x2 = int(x)
# 小于0 左转是 左轮降低 右轮加速
# 大于0 右转是 左轮加速 右轮减速
speed_L_1 += x2
speed_R_1 -= x2
# 标准化数据
if speed_L_1 > 1023:
speed_L_1 = 1023
if speed_L_1 < -1023:
speed_L_1 = -1023
if speed_R_1 > 1023:
speed_R_1 = 1023
if speed_R_1 < -1023:
speed_R_1 = -1023
speed_L = speed_L_1
speed_R = speed_R_1
speed_L_1 = 0
speed_R_1 = 0
sp_pwm_L.duty(abs(speed_L))
sp_pwm_R.duty(abs(speed_R))
print(str(speed_L) + '+' + str(speed_R))
# 当前速度为0 目标大于0则正转 小于0则反转
if speed_L > 0:
IN1.value(1)
IN2.value(0)
else:
IN1.value(0)
IN2.value(1)
# 当前速度为0 目标大于0则正转 小于0则反转
if speed_R > 0:
IN3.value(1)
IN4.value(0)
else:
IN3.value(0)
IN4.value(1)
except:
# 网络断开则开始停止
speed_L = 0
speed_R = 0
sp_pwm_L.duty(abs(speed_L))
sp_pwm_R.duty(abs(speed_R))
print("连接已断开3")
sock.close()
LED.value(1)
time.sleep(2)
break
sock.close()
这里简要说一下代码:
1.SSID,PASSWORD需要你自己配置无线网和密码。
2.里面有中文,你的IP和你的端口,需要为对应的服务器IP和端口,这个后面文章会提到,重点在于看逻辑。
3.逻辑很简单,就是连接上无线网,然后去服务器获取控制信息,分别控制两个轮子。
4.最开始的变量D1 D2 D3等需要根据板子以及驱动板来进行连接,上面代码是针对l298的,如果需要l298n或者其他的驱动板需要进行一定的修改,不同的驱动板控制逻辑不一样。
5.pwm范围是0-1023,为了方便传递,统一定义为0-1023为0-1023 反转时候为0到-1023,传递过程中为5000-6023表示0到-1023,后面服务端以及控制端都会有提到。
OK 不啰嗦了。
Comments | NOTHING